package br.com.unioConci.consulta.apresentacao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import br.com.r2.exception.R2Exception;
import br.com.r2.util.tipodado.Data;
import br.com.r2.util.tipodado.DataHora;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.Inteiro;
import br.com.r2.util.tipodado.Moeda;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;
import br.com.unioConci.cadastro.negocio.LocalPagamentoNgc;
import br.com.unioConci.cadastro.vo.LocalPagamentoVo;
import br.com.unioConci.consulta.negocio.ConsultaConciliacaoAnaliticoNgc;
import br.com.unioConci.upload.negocio.ArquivoFinanceiroAnaliticoNgc;
import br.com.unioConci.upload.vo.ArquivoFinanceiroAnaliticoVo;
import br.com.unioConci.upload.vo.filtro.FiltroArquivoVo;
import br.com.unioConci.util.Colecao;
import br.com.unioConci.util.jsf.AbstractBean;
import br.com.unioConci.util.jsf.JSFUtil;

public class ConsultaConciliacaoAnaliticoBean extends AbstractBean<ArquivoFinanceiroAnaliticoVo, ConsultaConciliacaoAnaliticoNgc>
{

   private List<LocalPagamentoVo> listaLocaisPagamentos;

   private JSFUtil util = new JSFUtil();

   public ConsultaConciliacaoAnaliticoBean()
   {
      super(ConsultaConciliacaoAnaliticoNgc.getInstancia());
      this.ACTION_SEARCH = "consultaConciliacaoAnalitico";
      this.pageTitle = "titulo_consulta_conciliacao_analitico";

   }
   
   @Override
   public String preparaPesquisar()
   {
      String retorno = super.preparaPesquisar();
      Calendar filtroData = new GregorianCalendar();
      filtroData.setTime(new Date());
      //filtroData.add(Calendar.DAY_OF_MONTH, -1);
      if (this.getSearchObject().getFiltro() == null)
      {
         this.getSearchObject().setFiltro(new FiltroArquivoVo());
      }
      this.getSearchObject().getFiltro().setDataInclusaoInicial(new Data(filtroData.getTime()));
      this.getSearchObject().getFiltro().setDataInclusaoFinal(new Data(filtroData.getTime()));
      this.getSearchObject().setLocalPagamentoVo(new LocalPagamentoVo());
      this.getSearchObject().setFlagConciliado(new Flag(YesNo.ALL));
      
      return retorno;
   }
   
   @Override
   protected void setListaPesquisa() throws R2Exception
   {
      this.listaLocaisPagamentos = new ArrayList<LocalPagamentoVo>();

      // lista de local de pagamento sintetico
      LocalPagamentoVo localPagamentoVo = new LocalPagamentoVo();
      localPagamentoVo.setTipoConciliacao(new Inteiro(LocalPagamentoNgc.TIPO_CONCILIACAO_ANALITICO));
      List<LocalPagamentoVo> listaResultado = LocalPagamentoNgc.getInstancia().pesquisar(localPagamentoVo, 0);
      
      if (listaResultado != null && listaResultado.size() > 0)
      {
         LocalPagamentoVo vazio = new LocalPagamentoVo();
         vazio.setDescricao(new Texto(""));
         
         this.listaLocaisPagamentos.add(vazio);
         this.listaLocaisPagamentos.addAll(listaResultado);
      }
   }
   
   @Override
   protected void validarPesquisar() throws R2Exception
   {
      this.getSearchObject().setValorTotalPagamento(null);
      if (this.getSearchObject().getFiltro() == null)
      {
         throw new R2Exception("peloMenosUmDosCamposObrigatorios");
      }
      boolean dataBaixaPreenchida = this.getSearchObject().getFiltro().getDataBaixaInicial() == null 
                                    || !this.getSearchObject().getFiltro().getDataBaixaInicial().isPreenchido();

      boolean dataInclusaoPreenchida = this.getSearchObject().getFiltro().getDataInclusaoInicial() == null 
                                    || !this.getSearchObject().getFiltro().getDataInclusaoInicial().isPreenchido();

      boolean dataConciliacaoPreenchida = this.getSearchObject().getFiltro().getDataConciliacaoInicial() == null 
                                    || !this.getSearchObject().getFiltro().getDataConciliacaoFinal().isPreenchido();

      boolean clientePreenchido = this.getSearchObject().getCodigoCliente() == null 
                                    || !this.getSearchObject().getCodigoCliente().isPreenchido();

      boolean nomeClientePreenchido = this.getSearchObject().getNomeCliente() == null 
                                 || !this.getSearchObject().getNomeCliente().isPreenchido();
      
      if (dataBaixaPreenchida && dataInclusaoPreenchida && clientePreenchido && nomeClientePreenchido && dataConciliacaoPreenchida)
      {
         throw new R2Exception("peloMenosUmDosCamposObrigatorios");
      }
   }
   
   @Override
   protected int getJoinPesquisar()
   {
      int join = ArquivoFinanceiroAnaliticoNgc.JOIN_LOCAL_PAGAMENTO;
      
      return join;
   }
   
   @Override
   public void pesquisar(ActionEvent event)
   {
      super.pesquisar(event);
      
      List<ArquivoFinanceiroAnaliticoVo> listaResultado = this.getSearchResult();
      double totalValorPagamento = 0;
      if (listaResultado != null && listaResultado.size() > 0)
      {
        totalValorPagamento = Colecao.somaCampo(listaResultado, "ValorPagamento");
      }
      this.getSearchObject().setValorTotalPagamento(new Moeda(totalValorPagamento));
   }
   
   public void conciliar (ActionEvent event)
   {
       try
       {
           if (this.getSelectedRowEntity() != null) 
           {
               this.getSelectedRowEntity().setFlagConciliado(new Flag(YesNo.YES));
               this.getSelectedRowEntity().setUsuarioConciliacaoVo(util.getUsuarioLogado());
               this.getSelectedRowEntity().setDataConciliacao(new DataHora(new Date().getTime()));
           }
       }
       catch (R2Exception e)
       {
           FacesMessage message = new FacesMessage(e.getMensagem());  
           message.setSeverity(FacesMessage.SEVERITY_ERROR);  
           FacesContext.getCurrentInstance().addMessage("", message);
       }
   }
   
   public void desconciliar(ActionEvent event)
   {
      try
      {

         if (this.getSelectedRowEntity() != null)
         {
            this.getSelectedRowEntity().setFlagConciliado(new Flag(YesNo.NO));
            this.getSelectedRowEntity().setUsuarioConciliacaoVo(util.getUsuarioLogado());
            this.getSelectedRowEntity().setDataConciliacao(new DataHora(new Date().getTime()));
         }
      }
      catch (R2Exception e)
      {
         FacesMessage message = new FacesMessage(e.getMensagem());
         message.setSeverity(FacesMessage.SEVERITY_ERROR);
         FacesContext.getCurrentInstance().addMessage("", message);
      }
   }

   public void atualizar(ActionEvent event)
   {
      try
      {

         List<ArquivoFinanceiroAnaliticoVo> listaConciliacoes = this.getSearchResult();

         if (listaConciliacoes == null || listaConciliacoes.size() <= 0)
         {
            throw new R2Exception("campo.obrigatorio.atualizar");
         }
         
         ArquivoFinanceiroAnaliticoNgc.getInstancia().atualizar(listaConciliacoes);
         

         FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                                                      util.getBundle().getString("itens.conciliados.sucesso"), null));
         
         this.cancelar(event);
      }
      catch (R2Exception e)
      {
         FacesMessage message = new FacesMessage(e.getMensagem());
         message.setSeverity(FacesMessage.SEVERITY_ERROR);
         FacesContext.getCurrentInstance().addMessage("", message);
      }
   }
   
   public void exibirOcultarRazao(ActionEvent event)
   {
      boolean estadoAtual = this.getSelectedRowEntity().isExibirListaRazao();
      this.getSelectedRowEntity().setExibirListaRazao(!estadoAtual);
   }

   public List<LocalPagamentoVo> getListaLocaisPagamentos()
   {
      return listaLocaisPagamentos;
   }

   public void setListaLocaisPagamentos(List<LocalPagamentoVo> listaLocaisPagamentos)
   {
      this.listaLocaisPagamentos = listaLocaisPagamentos;
   }

}
